/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ws.converter;

import entidade.persistencia.CategoriaProduto;
import java.net.URI;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlAttribute;
import javax.ws.rs.core.UriBuilder;
import javax.persistence.EntityManager;
import entidade.persistencia.Produto;
import java.util.Collection;
import java.util.List;

/**
 *
 * @author victorinox
 */

@XmlRootElement(name = "categoriaProduto")
public class CategoriaProdutoConverter {
    private CategoriaProduto entity;
    private URI uri;
    private int expandLevel;
  
    /** Creates a new instance of CategoriaProdutoConverter */
    public CategoriaProdutoConverter() {
        entity = new CategoriaProduto();
    }

    /**
     * Creates a new instance of CategoriaProdutoConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded@param isUriExtendable indicates whether the uri can be extended
     */
    public CategoriaProdutoConverter(CategoriaProduto entity, URI uri, int expandLevel, boolean isUriExtendable) {
        this.entity = entity;
        this.uri = (isUriExtendable) ? UriBuilder.fromUri(uri).path(entity.getCategoriaId() + "/").build() : uri;
        this.expandLevel = expandLevel;
        getProdutoCollection();
        getCategoriaProdutoCollection();
        getCategoriaPaiId();
    }

    /**
     * Creates a new instance of CategoriaProdutoConverter.
     *
     * @param entity associated entity
     * @param uri associated uri
     * @param expandLevel indicates the number of levels the entity graph should be expanded
     */
    public CategoriaProdutoConverter(CategoriaProduto entity, URI uri, int expandLevel) {
        this(entity, uri, expandLevel, false);
    }

    /**
     * Getter for categoriaId.
     *
     * @return value for categoriaId
     */
    @XmlElement
    public Integer getCategoriaId() {
        return (expandLevel > 0) ? entity.getCategoriaId() : null;
    }

    /**
     * Setter for categoriaId.
     *
     * @param value the value to set
     */
    public void setCategoriaId(Integer value) {
        entity.setCategoriaId(value);
    }

    /**
     * Getter for nome.
     *
     * @return value for nome
     */
    @XmlElement
    public String getNome() {
        return (expandLevel > 0) ? entity.getNome() : null;
    }

    /**
     * Setter for nome.
     *
     * @param value the value to set
     */
    public void setNome(String value) {
        entity.setNome(value);
    }

    /**
     * Getter for produtoCollection.
     *
     * @return value for produtoCollection
     */
    @XmlElement
    public ProdutoesConverter getProdutoCollection() {
        if (expandLevel > 0) {
            if (entity.getProdutoCollection() != null) {
                return new ProdutoesConverter(entity.getProdutoCollection(), uri.resolve("produtoCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for produtoCollection.
     *
     * @param value the value to set
     */
    public void setProdutoCollection(ProdutoesConverter value) {
        entity.setProdutoCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for categoriaProdutoCollection.
     *
     * @return value for categoriaProdutoCollection
     */
    @XmlElement
    public CategoriaProdutoesConverter getCategoriaProdutoCollection() {
        if (expandLevel > 0) {
            if (entity.getCategoriaProdutoCollection() != null) {
                return new CategoriaProdutoesConverter(entity.getCategoriaProdutoCollection(), uri.resolve("categoriaProdutoCollection/"), expandLevel - 1);
            }
        }
        return null;
    }

    /**
     * Setter for categoriaProdutoCollection.
     *
     * @param value the value to set
     */
    public void setCategoriaProdutoCollection(CategoriaProdutoesConverter value) {
        entity.setCategoriaProdutoCollection((value != null) ? value.getEntities() : null);
    }

    /**
     * Getter for categoriaPaiId.
     *
     * @return value for categoriaPaiId
     */
    @XmlElement
    public CategoriaProdutoConverter getCategoriaPaiId() {
        if (expandLevel > 0) {
            if (entity.getCategoriaPaiId() != null) {
                return new CategoriaProdutoConverter(entity.getCategoriaPaiId(), uri.resolve("categoriaPaiId/"), expandLevel - 1, false);
            }
        }
        return null;
    }

    /**
     * Setter for categoriaPaiId.
     *
     * @param value the value to set
     */
    public void setCategoriaPaiId(CategoriaProdutoConverter value) {
        entity.setCategoriaPaiId((value != null) ? value.getEntity() : null);
    }

    /**
     * Returns the URI associated with this converter.
     *
     * @return the uri
     */
    @XmlAttribute
    public URI getUri() {
        return uri;
    }

    /**
     * Sets the URI for this reference converter.
     *
     */
    public void setUri(URI uri) {
        this.uri = uri;
    }

    /**
     * Returns the CategoriaProduto entity.
     *
     * @return an entity
     */
    @XmlTransient
    public CategoriaProduto getEntity() {
        if (entity.getCategoriaId() == null) {
            CategoriaProdutoConverter converter = UriResolver.getInstance().resolve(CategoriaProdutoConverter.class, uri);
            if (converter != null) {
                entity = converter.getEntity();
            }
        }
        return entity;
    }

    /**
     * Returns the resolved CategoriaProduto entity.
     *
     * @return an resolved entity
     */
    public CategoriaProduto resolveEntity(EntityManager em) {
        List<Produto> produtoCollection = entity.getProdutoCollection();
        List<Produto> newprodutoCollection = new java.util.ArrayList<Produto>();
        for (Produto item : produtoCollection) {
            newprodutoCollection.add(em.getReference(Produto.class, item.getProdutoId()));
        }
        entity.setProdutoCollection(newprodutoCollection);
        List<CategoriaProduto> categoriaProdutoCollection = entity.getCategoriaProdutoCollection();
        List<CategoriaProduto> newcategoriaProdutoCollection = new java.util.ArrayList<CategoriaProduto>();
        for (CategoriaProduto item : categoriaProdutoCollection) {
            newcategoriaProdutoCollection.add(em.getReference(CategoriaProduto.class, item.getCategoriaId()));
        }
        entity.setCategoriaProdutoCollection(newcategoriaProdutoCollection);
        CategoriaProduto categoriaPaiId = entity.getCategoriaPaiId();
        if (categoriaPaiId != null) {
            entity.setCategoriaPaiId(em.getReference(CategoriaProduto.class, categoriaPaiId.getCategoriaId()));
        }
        return entity;
    }
}
